package handler

import (
	"boy-go/middlewares"
	"boy-go/modules/system/service"
	"boy-go/modules/system/vo"
	"boy-go/pkg/response"
	"boy-go/pkg/xnum"
	"boy-go/pkg/xslices"
	"github.com/gin-gonic/gin"
	"strconv"
	"strings"
)

// AddSysDeptRouter 添加部门表路由
func AddSysDeptRouter(group *gin.RouterGroup) {
	group.GET("/dept/:id", middlewares.HasPermission("system:dept:query"), get_dept)                                                      // 获取部门表详情
	group.GET("/dept/list", middlewares.HasPermission("system:dept:list"), list_dept)                                                     // 获取部门列表
	group.GET("/dept/list/exclude/:deptId", middlewares.HasPermission("system:dept:list"), list_exclude_dept)                             // 查询部门列表（排除节点）
	group.POST("/dept", middlewares.HasPermission("system:dept:add"), middlewares.Logger("部门管理", middlewares.INSERT), add_dept)           // 新增部门表
	group.PUT("/dept", middlewares.HasPermission("system:dept:edit"), middlewares.Logger("部门管理", middlewares.UPDATE), edit_dept)          // 修改部门表
	group.DELETE("/dept/:ids", middlewares.HasPermission("system:dept:remove"), middlewares.Logger("部门管理", middlewares.DELETE), del_dept) // 删除部门表
}

// get_dept
// @Summary 获取部门表详情
// @Description 获取部门表详情（管理页面）
// @Tags system-dept
// @Accept json
// @Produce json
// @Param id path string true "ID"
// @Success 200 {object} response.R[vo.SysDeptModel] "ok"
// @Failure 400 {string} string "bad request"
// @Failure 500 {string} string "Internal Server Error"
// @Router /system/dept/{id} [get]
func get_dept(ctx *gin.Context) {
	var idStr = ctx.Param("id")
	id := xnum.Str2int64(idStr)
	m, err := service.NewSysDeptService().GetById(id)
	if err != nil {
		response.AjaxError(ctx, err)
		return
	}
	response.AjaxSuccess(ctx, m)
}

// list_dept
// @Summary 获取部门表列表
// @Description 获取部门表列表（管理页面）
// @Tags system-dept
// @Accept json
// @Produce json
// @Success 200 {object} response.R[PageRes[vo.SysDeptModel]] "ok"
// @Failure 400 {string} string "bad request"
// @Failure 500 {string} string "Internal Server Error"
// @Router /system/dept/list [get]
func list_dept(ctx *gin.Context) {
	req := vo.QuerySysDeptReq{}
	if err := ctx.BindQuery(&req); err != nil {
		response.AjaxError(ctx, err)
		return
	}
	page, err := service.NewSysDeptService().List(&req)
	if err != nil {
		response.AjaxError(ctx, err)
		return
	}
	response.AjaxSuccess(ctx, page.List)
}

func list_exclude_dept(ctx *gin.Context) {
	var idStr = ctx.Param("deptId")
	deptId := xnum.Str2int64(idStr)
	lisRsp, err := service.NewSysDeptService().List(&vo.QuerySysDeptReq{})
	if err != nil {
		response.AjaxError(ctx, err)
		return
	}
	depts := make([]*vo.SysDeptModel, 0)
	//排除deptId
	for _, d := range lisRsp.List {
		if d.DeptId == deptId {
			continue
		}
		// 拆分 ancestors 字符串，并检查是否包含 deptId 字符串
		ancestors := strings.Split(*d.Ancestors, ",")
		target := strconv.FormatInt(deptId, 10)
		if xslices.Contains(ancestors, target) {
			continue // 排除祖先中包含目标 deptId 的节点
		}
		depts = append(depts, d)
	}
	response.AjaxSuccess(ctx, depts)
}

// add_dept
// @Summary 新增部门表
// @Description 新增部门表（管理页面）
// @Tags system-dept
// @Accept json
// @Produce json
// @Param req body  vo.AddSysDeptReq true "req"
// @Success 200 {object} response.R[vo.AddSysDeptRsp] "ok"
// @Failure 400 {string} string "bad request"
// @Failure 500 {string} string "Internal Server Error"
// @Router /system/dept [post]
func add_dept(ctx *gin.Context) {
	var req vo.AddSysDeptReq
	if err := ctx.ShouldBind(&req); err != nil {
		response.AjaxFailCode(ctx, response.ParamError)
		return
	}
	m, err := service.NewSysDeptService().Add(&req)
	if err != nil {
		response.AjaxFailCode(ctx, response.ServerError)
	} else {
		response.AjaxSuccess(ctx, m)
	}
}

// edit_dept
// @Summary 编辑部门表
// @Description 编辑部门表（管理页面）
// @Tags system-dept
// @Accept json
// @Produce json
// @Param req body  vo.EditSysDeptReq true "req"
// @Success 200 {object} response.R[vo.EditSysDeptRsp] "ok"
// @Failure 400 {string} string "bad request"
// @Failure 500 {string} string "Internal Server Error"
// @Router /system/dept [put]
func edit_dept(ctx *gin.Context) {
	var req vo.EditSysDeptReq
	if err := ctx.ShouldBind(&req); err != nil {
		response.AjaxFailCode(ctx, response.ParamError)
		return
	}
	m, err := service.NewSysDeptService().Edit(&req)
	if err != nil {
		response.AjaxFailCode(ctx, response.ServerError)
	} else {
		response.AjaxSuccess(ctx, m)
	}
}

// del_dept
// @Summary 删除部门表
// @Description 删除部门表（管理页面）
// @Tags system-dept
// @Accept json
// @Produce json
// @Success 200 {object} response.R[string] "ok"
// @Failure 400 {string} string "bad request"
// @Failure 500 {string} string "Internal Server Error"
// @Router /system/dept [delete]
func del_dept(ctx *gin.Context) {
	var idsStr = ctx.Param("ids")
	ids := strings.Split(idsStr, ",")
	err := service.NewSysDeptService().BatchDel(ids)
	if err != nil {
		response.AjaxFailCode(ctx, response.ServerError)
	} else {
		response.AjaxSuccess(ctx, nil)
	}
}
